#include <stdio.h>
#include <stdlib.h>
#include "ElementL.h"
#include "Liste.h"
#include "position.h"


void initialiserListe(Liste * l)
/* Precondition : l non prealablement initialisee
   Postcondition : la liste l initialisee est vide */
{
   (*l).prem=NULL;                       
   (*l).last=NULL;
}

int estVideListe(const Liste * l)
/* Precondition : l prealablement initialisee et manipulee uniquement
                  a travers les operations du module
   Resultat : 1 si l est vide, 0 sinon */
{
 if ( (*l).prem == NULL && (*l).last == NULL ) 
   {
	return 1;
   } 
   return 0;
}


void ajouterEnTeteListe(ElementL e,Liste * l)
/* Precondition : l et e initialises et manipules uniquement a travers les 
                  operations de leurs modules respectifs
   Postcondition : e est ajoute en tete de l */

{
    Cellule *temp = (Cellule*) malloc (sizeof (Cellule)); 
   (*temp).info = e;
   (*temp).precedent=NULL;
   (*temp).suivant=(*l).prem;

    if(estVideListe(l)==1)
    {
	
        (*l).last=temp;
    }
    
    else 
    {
	l->prem->precedent=temp;  
        
    } 

    (*l).prem=temp; 
    
}

/* ajout de posx et posy*/
void ajouterEnQueueListe(ElementL e, Liste * l, int posx, int posy)
/* Precondition : l et e initialises et manipules uniquement a travers les 
                  operations de leurs modules respectifs 
   Postcondition : e est ajoute en fin de la liste l */


{
      Cellule *temp = (Cellule*) malloc (sizeof (Cellule)); 
   (*temp).info = e;
   (*temp).suivant=NULL;
   (*temp).precedent=(*l).last;
   (*temp).p.posX=posx;/*modifié ->*/
   (*temp).p.posY=posy;/*modifié ->*/

    if(estVideListe(l)==1)
    {
	
        (*l).prem=temp;
    }
    
    else 
    {
	l->last->suivant=temp;  
        
    } 

    (*l).last=temp; 
}

unsigned int nbElementsListe(const Liste * l)
/* Precondition : l initialisee et manipulee uniquement a travers les 
                  operations du module
   Resultat : nombre d'elements contenus dans la liste */
{
   	int i=0;
   	Cellule *temp = l->prem;
 	while (temp !=NULL)
	{
 	    i++;
            temp = temp->suivant;
                		
        }
        return i;
        
}



ElementL iemeElementListe(const Liste * l, unsigned int i)
{
  unsigned int j;
  Cellule * temp = l->prem;
  for(j = 0; j < i; j++)
    {
      temp = temp->suivant;
      if (temp == NULL) {fprintf(stderr, "Erreur, i trop grand \n"); exit(EXIT_FAILURE);}
    }
  return temp->info;
}


void modifierIemeElementListe(const Liste * l, unsigned int i, ElementL e)
{
  unsigned int j;
  Cellule * temp = l->prem;
  for(j = 0; j < i; j++)
    {
      temp = temp->suivant;
      if (temp == NULL) {fprintf(stderr, "Erreur, i trop grand \n"); exit(EXIT_FAILURE);}
    }
  temp->info = e;
}



void supprimerTeteListe(Liste * l)
/* Precondition : l n'est pas vide
   Postcondition : la liste l perd son premier element */

{
    Cellule *temp= l->prem;
    l->prem = l->prem->suivant ;
    if (l->prem !=NULL)
	{
     		l->prem->precedent=NULL;
        }
    else
        {
 		l->last=NULL;
        }
free(temp);
}

void viderListe(Liste *l)
{
	while (estVideListe (l) == 1)
	supprimerTeteListe (l);
}

void testament(Liste *l)
{
  viderListe(l);
}



Cellule * premiereCelluleListe (const Liste *l)
{
	return l->prem;
}

void affecterListe (Liste *l1, const Liste *l2)
{
    Cellule *temp;
    viderListe(l1);
    temp= l2->prem;
    while (temp!=NULL)
    {
         /* adaptation des parametres*/
         ajouterEnQueueListe(temp->info,l1,1,1);
         temp=temp->suivant;
    }
}

void affichageListeGaucheDroite(const Liste * l){
        Cellule  *c=l->prem;
        while((c != NULL)){
                afficherElementL(c->info);
                c=c->suivant;
        }
}

void affichageListeDroiteGauche(const Liste * l){
        Cellule  *c=l->last;
        while((c != NULL)){
                afficherElementL(c->info);
                c= c->precedent;
        }
        printf(" \n");
}


